# @Version        : 1.0
# @Update Time    : 2025/10/15 00:00
# @File           : registration.py
# @IDE            : PyCharm
# @Desc           : 认证逻辑注册管理器
from typing import Dict, Optional
from authx.core.auth_logic import AuthLogic


class AuthLogicRegistry:
    """
    认证逻辑注册中心，用于管理全局AuthLogic实例
    """

    _instance: Optional["AuthLogicRegistry"] = None
    _auth_logics: Dict[str, AuthLogic] = {}

    def __new__(cls):
        """
        单例模式
        """
        if cls._instance is None:
            cls._instance = super().__new__(cls)
        return cls._instance

    def register(self, auth_logic: AuthLogic) -> None:
        """
        注册AuthLogic实例

        Args:
            auth_logic: AuthLogic实例
        """
        self._auth_logics[auth_logic.login_type] = auth_logic

    def get(self, login_type: str) -> Optional[AuthLogic]:
        """
        获取指定类型的AuthLogic实例

        Args:
            login_type: 登录类型

        Returns:
            AuthLogic实例，如果不存在则返回None
        """
        return self._auth_logics.get(login_type)

    def get_all(self) -> Dict[str, AuthLogic]:
        """
        获取所有注册的AuthLogic实例

        Returns:
            所有AuthLogic实例的字典
        """
        return self._auth_logics.copy()

    def unregister(self, login_type: str) -> None:
        """
        注销指定类型的AuthLogic实例

        Args:
            login_type: 登录类型
        """
        if login_type in self._auth_logics:
            del self._auth_logics[login_type]

    def clear(self) -> None:
        """
        清空所有注册的AuthLogic实例
        """
        self._auth_logics.clear()


# 创建全局注册中心实例
_registry = AuthLogicRegistry()


def register_auth_logic(auth_logic: AuthLogic) -> None:
    """
    注册AuthLogic实例到全局注册中心

    Args:
        auth_logic: AuthLogic实例
    """
    _registry.register(auth_logic)


def get_auth_logic(login_type: str) -> Optional[AuthLogic]:
    """
    从全局注册中心获取AuthLogic实例

    Args:
        login_type: 登录类型

    Returns:
        AuthLogic实例，如果不存在则返回None
    """
    return _registry.get(login_type)


def get_all_auth_logics() -> Dict[str, AuthLogic]:
    """
    获取所有注册的AuthLogic实例

    Returns:
        所有AuthLogic实例的字典
    """
    return _registry.get_all()


def unregister_auth_logic(login_type: str) -> None:
    """
    从全局注册中心注销AuthLogic实例

    Args:
        login_type: 登录类型
    """
    _registry.unregister(login_type)


def clear_auth_logics() -> None:
    """
    清空所有注册的AuthLogic实例
    """
    _registry.clear()
